"""
目标：用高阶函数处理订单数据
1. 过滤出价格大于等于 100 的订单（filter）
2. 对这些订单打 8 折（map）
3. 求出总价（reduce）
"""
from functools import reduce

# 订单列表，每个订单是一个字典，包含订单ID和价格
orders = [
    {"id": 1, "price": 120},
    {"id": 2, "price": 55},
    {"id": 3, "price": 230},
    {"id": 4, "price": 75}
]

# 1. 使用 filter() 函数过滤出价格大于等于 100 的订单
expensive_orders = list(filter(lambda order: order["price"] >= 100, orders))
print(f"价格大于等于100的订单: {expensive_orders}")

# 2. 使用 map() 函数处理订单
# 2.1 方法一：只提取折扣后的价格
discounted_prices = list(map(lambda order: order["price"] * 0.8, expensive_orders))
print(f"折扣后的价格列表: {discounted_prices}")

# 2.2 方法二：保留完整订单信息，但更新价格
"""
说明:
- **order 表示复制原订单的所有键值对
- "price": order["price"] * 0.8 表示更新价格为原价的八折
"""
discounted_orders = list(map(
    lambda order: {**order, "price": order["price"] * 0.8},
    expensive_orders
))
print(f"折扣后的完整订单: {discounted_orders}")

# 3. 使用 reduce() 计算总价
total_price = reduce(
    lambda total, order: total + order["price"],
    discounted_orders,
    0
)
print(f"折扣后的订单总价: {total_price}")

"""
redece() 函数的参数
- 第一个参数：函数（两个参数）
- 第二个参数：可迭代对象
- 第三个参数：初始值
"""
total_price = reduce(
    lambda total, order: total + order["price"],  # 第一个参数：函数（两个参数）
    discounted_orders,  # 第二个参数：可迭代对象
    0  # 第三个参数：初始值
)

# lambda 表达式的参数
# 第一个参数：acc（或叫 total、result、sum……） 累加器（上一步的返回结果）
#
# 第二个参数：item  当前从可迭代对象里取出来的元素
